<?

/**
 * Lord_Plugin_Acl
 * 
 * Плагин для контроля прав доступа к разным объектам 
 * В качестве входного параметра принимает класс Acl, 
 * в вотором расписаны права доступа для каждого модуля, контроллера, действия
 * 
 * @author Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Lord_Plugin_Acl extends Zend_Controller_Plugin_Abstract 
{

	private        $acl  = null;
	private        $role = null;
	private static $instance = NULL; 
	private        $model    = null; 

/*------------------------------------------------------------------------------*/

	private  function __construct(Zend_Acl $acl) 
	{
		$this->acl = $acl;
		$this->model = new User(); 
		
	}

/*------------------------------------------------------------------------------*/

	private function __clone()
	{
	}

/*------------------------------------------------------------------------------*/
	
	public static function getInstance (Zend_Acl $acl )
	{      
		if ( is_null ( self::$instance ) )
		{
			self::$instance = new self($acl);
		}
		
		return self::$instance;
	}
 
/*------------------------------------------------------------------------------*/

	public function preDispatch(Zend_Controller_Request_Abstract $request) 
	{       
		// Получаем объект  Zend_Layout
		$layout = Zend_Layout::getMvcInstance();

		// Получаем объект  вида
		$view = $layout->getView();


		$auth = Zend_Auth::getInstance();     
		// если есть какой-то пользователь в хранилище сессии
		if ($auth->hasIdentity() == true) 
		{
			// получаем данные этого пользователя 
			$user = $auth->getIdentity();
			$role = ($this->role == null)
				  ? $this->model->getRole($user->role)
				  : $this->role;
				  
			$user->roleName = $role->name;
		} 
		else
		{
			$user->roleName = 'anon';
		}  
		// кладем в переменную вида, для отображения 
		$view->user = $user;

		/*--------------------------------------------------------------*/

		$request    = $this->getRequest();

		$controller = $request->getControllerName();
		$module     = $request->getModuleName();
		$action     = $request->getActionName();

		$acl = $this->acl;
		$isAllow = $acl->isAllowed($user->roleName, $module.'_'.$controller, $action);
		 
		if($isAllow == false)
		{
			  $request->setModuleName('user')
					  ->setControllerName('login')
					  ->setActionName('index');
		}
			 
		$view->acl = $acl;

	}
	
/*------------------------------------------------------------------------------*/

}
